package ioc;


import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.List;

public interface IBeanDefinition
{
    /**
     * 单例
     */
    String SCOPE_SINGLETION = "singleton";

    /**
     * 原型
     */
    String SCOPE_PROTOTYPE = "prototype";

    /**
     * 获取Bean字节码
     */
    Class getBeanClass();

    /**
     * 获取Bean工厂的方法名
     */
    String getFactoryMethodName();

    /**
     * 获取Bean工厂的Bean名
     */
    String getFactoryBeanName();

    /**
     * 获取Bean的作用域
     */
    String getScope();

    /**
     * Bean是否单例
     */
    Boolean isSingleton();

    /**
     * Bean是否原型
     */
    Boolean isPrototype();

    /**
     * 获取Bean初始化的方法
     */
    String getInitMethodName();

    /**
     * 获取Bean销毁的方法
     */
    String getDestroyMethodName();

    /**
     * 获取构造器参数值
     */
    List<Object> getConstructorArgumentValues();
    /**
     * 获取属性值
     */
    List<Object> getPropertyValues();

    /**
     * 校验Bean定义信息是否合法
     */
    default boolean validate()
    {
        if(this.getBeanClass()==null)
        {//如果没定义class 又没定义bean工厂方法
           if(StringUtils.isBlank(this.getFactoryMethodName()))
           {
               return false;
           }
        }else
            {
                if(StringUtils.isNotBlank(this.getFactoryBeanName()))
                {//定义了class 又定义了工厂 不合法
                    return false;
                }
            }
        return true;
    }

    Constructor getConstructor();

    void setConstructor(Constructor constructor);

    Method getFactoryMethod();

    void setFactoryMethod(Method method);

}
